package com.zhangkunhao.notes.controller;

import com.zhangkunhao.notes.bean.ButtonName;
import com.zhangkunhao.notes.entity.DO.Activity;
import com.zhangkunhao.notes.entity.DO.Jokes;
import com.zhangkunhao.notes.entity.DO.User;
import com.zhangkunhao.notes.service.ActivityService;
import com.zhangkunhao.notes.service.JokeService;
import com.zhangkunhao.notes.service.UserService;
import com.zhangkunhao.notes.util.StringToIntegerUtil;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.util.*;

import static com.zhangkunhao.notes.util.DateFormChangeUtil.getToday;

/**
 * 用户菜单
 *
 * @author 张坤浩
 */
public class UserMenuListener implements ActionListener {
    private User user;
    Scanner sc = new Scanner(System.in);

    public UserMenuListener() {
    }

    public UserMenuListener(User user) {
        this.user = user;
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        UserService userService = new UserService();

        List<User> users;

        //从数据库获取登录的用户最新的数据（包括数据库默认的数据，如总功德量,这样方便调用其他service层）
        user = userService.queryByUserName(user.getUserName());

        //将controller层接收service层得到的较为完整的用户数据传到另外的Service层
        JokeService jokeService = new JokeService(user);
        ActivityService activityService = new ActivityService();

        //判断是哪个按钮
        if (ButtonName.SHARE_JOKES.equals(e.getActionCommand())) {

            //分享笑话
            System.out.println("请输入地狱笑话的标题");
            String title = sc.next();

            System.out.println("请输入地狱笑话的内容");
            String content = sc.next();

            System.out.println("请输入地狱笑话每次阅读需要消耗的功德量，必须是整数");
            //调用工具类进行数据判断处理
            Integer consumingVirtue = StringToIntegerUtil.getInteger(sc.next());
            //数字解析没有问题并且为正整数
            if (consumingVirtue > 0) {
                //调用service层
                String result = jokeService.shareJokes(title, content, consumingVirtue);
                //从service层接收数据判断发布笑话是否成功
                System.out.println("地狱笑话发布成功".equals(result) ? "地狱笑话发布成功" : "地狱笑话发布失败");
            }

        } else if (ButtonName.READ_OTHER_JOKES.equals(e.getActionCommand())) {

            //更新目前笑话的集合
            List<Jokes> jokes = jokeService.queryList(0);
            System.out.println("消耗功德查看别人的地狱笑话：");
            //输出现有笑话
            System.out.println("---------------现有笑话-----------------");
            jokes.forEach(jokes1 -> System.out.println("笑话发布者: " + jokes1.getLauncherName() + " 标题："
                    + jokes1.getTitle() + " 消耗的功德量：" + jokes1.getConsumingVirtue()));

            System.out.println("请输入你想查看的地狱笑话的发布者的用户名");
            String launchName = sc.next();

            System.out.println("请输入你想查看的地狱笑话的标题：");
            String jokeTitle = sc.next();

            //从service层接收数据判断是否存在该笑话发布者
            boolean result = jokeService.readJoke(jokes, launchName, jokeTitle, userService);
            System.out.println(result
                    ? "访问成功，并成功更新用户功德数据和笑话访问记录"
                    : "访问失败，地狱笑话的发布者的用户名或者地狱笑话的名称错误");
        } else if (ButtonName.ATTEND_ACTIVITY.equals(e.getActionCommand())) {

            //参加各种积攒功德的活动,先得到最新的活动数据
            List<Activity> activityList = activityService.readAllActivities(0);
            //输出报名截止日期没到的活动
            System.out.println("---------------------报名截止日期没到的活动---------------------");
            activityList.stream().filter(activity -> {
                try {
                    return activity.getDeadline().after(getToday());
                } catch (ParseException ex) {
                    ex.printStackTrace();
                }
                return false;
            }).forEach(System.out::println);

            System.out.println("请输入你要参加的活动：");
            String activityName = sc.next();
            //调用service层
            String result = activityService.participateActivity(activityName, user);
            System.out.println(result);

        } else if (ButtonName.EDIT_PERSONAL_INFORMATION.equals(e.getActionCommand())) {

            //从数据库获取登录的用户最新的数据
            user = userService.queryByUserName(user.getUserName());
            System.out.println("修改前的个人信息：" + user);
            System.out.println("当前用户信息,提供编辑的信息仅用户名、密码、性别、身高、生日，请输入要修改的个人表单项目名称：");
            String formItem = sc.next();
            System.out.println("用户名、密码均为非空格字符串，性别仅男、女，生日格式为2000-01-01，身高单位为厘米，请输入你的新" + formItem + ":");
            String newInformationItem = sc.next();
            //调用service层
            String s = userService.editPersonInformation(formItem, newInformationItem, user);
            System.out.println(s);

        } else if (ButtonName.CONSUMING_VIRTUE_RANKING_LIST.equals(e.getActionCommand())) {

            //每次点下按钮都从数据库获取最新数据
            users = userService.queryList(0);
            //消耗功德降序,不使用原先的集合了，调用service层
            List<User> rankUsersList = userService.rankConsumingVirtue(users);
            int i = 0;
            System.out.println("-----------------------消耗功德排行榜前十-----------------------");
            for (User user1 : rankUsersList) {
                i++;
                if (i <= 10 && i < rankUsersList.size()) {
                    System.out.println("第" + i + "名->" + " 用户名：" + user1.getUserName() + " 消耗功德: " + user1.getPayVirtue());
                }
            }

        } else if (ButtonName.VIRTUE_RANKING_LIST.equals(e.getActionCommand())) {

            //每次点下按钮都从数据库获取最新数据
            users = userService.queryList(0);
            //调用service层，不使用原先的集合了，进行总功德排序
            List<User> users1 = userService.rankCurrentVirtue(users);
            int i = 0;
            System.out.println("-----------------------总功德排行榜前十-----------------------");
            for (User user1 : users1) {
                i++;
                if (i <= 10 && i < users1.size()) {
                    System.out.println("第" + i + "名->" + " 用户名：" + user1.getUserName() + " 总功德: " + user1.getInitVirtue());
                }
            }

        } else if (ButtonName.READ_OTHER_INFORMATION.equals(e.getActionCommand())) {

            //通过用户名模糊查询搜索用户
            System.out.println("请输入要搜索的指定用户的用户名，至少包含一个关键字");
            String fuzzyName = sc.next();
            //调用service层模糊查询
            List<User> fuzzyQuery = userService.fuzzyQuery(fuzzyName);
            //这里注意sql语句如何拼接的问题
            if (fuzzyQuery.size() == 0) {
                System.out.println("找不到符合该搜索条件的用户");
            } else {
                System.out.println("符合该搜索条件的用户:");
                for (User user1 : fuzzyQuery) {
                    System.out.println("用户名：" + user1.getUserName() + " 性别：" + user1.getGender()
                            + " 生日：" + user1.getBirthday() + " 功德量：" + user1.getInitVirtue());
                }
            }

        }
    }
}
